﻿////////////////////////////////////////////////////////////////////////////
//                                                                        //
//                       Copyright (c) 2003-2008                          //
//                              Wang Hua                                  //
//                                                                        //
////////////////////////////////////////////////////////////////////////////

// Orbit.cpp: implementation of the COrbit class.
//
//////////////////////////////////////////////////////////////////////


#include "AsOrbitProp.h"
#include "AsOrbitParamTrans.h"
#include "AsMath.h"


using namespace std;


void AsTwoBodyProp(const CModOrbElem& Orb, double  t, const double gm, CCoord& cartPos, CCoord& cartVel)
{
    // 1. 计算平均运动和平近点角
    CModOrbElem temp_Orb = Orb;
    double n = sqrt(gm / pow(temp_Orb.m_PeriRad, 3));
    double M0 = AsTrueToMean(temp_Orb.m_TrueA, temp_Orb.m_Ecc);
    double M = M0 + n * t;
    double TrueA = AsMeanToTrue(M, temp_Orb.m_Ecc);
    temp_Orb.m_TrueA = TrueA;
    AsModOrbElemToCart(temp_Orb, gm, cartPos, cartVel);
}


// 计算真近点角变化所需时间
double AsTimeForTrueAnomalyChange(double nu1, double nu2, double e, double a) 
{
    // 计算初始和最终的平近点角
    double M1 = AsTrueToMean(nu1, e);
    double M2 = AsTrueToMean(nu2, e);

    // 计算平近点角变化量
    double deltaM = M2 - M1;
    if (deltaM < 0) deltaM += 2 * AsCPI; // 确保变化量为正

                                         // 计算轨道周期 T
    double T = 2 * AsCPI * sqrt(pow(a, 3) / AsCEarthGrav);;

    // 计算时间
    double time = (deltaM / (2 * AsCPI)) * T;
    return time;
}

